265. Golang簡略筆記(二)
WHY
懶是工程師的原動力,
起因是我不想要手動比對兩份GCP價格的金額有哪些差距。
用excel vlookup 應該也是能處理,但可能需要重複的剪剪貼貼,
或是寫成vba,都要寫code的話,就直接寫吧。
Note
- 回傳時,可以用
_
省略回傳的參數
只取得row值,備忘一下
cell | col | row |
---|---|---|
A1 | 1 | 1 |
A8 | 1 | 8 |
B1 | 2 | 1 |
_, lastEndRow := parseCell(merge.GetEndAxis())
// parseCell: 將 Excel 的儲存格名稱 (如 "A1") 解析為列號與行號
func parseCell(cell string) (col int, row int) {
col, row, err := excelize.CellNameToCoordinates(cell)
if err != nil {
log.Fatalf("解析儲存格名稱失敗: %v", err)
}
return col, row
}
- 拆func時,傳送指標
解析excel,不可避免的就是開檔,
用指標的話
-
避免複製大型結構體:
excelize.File
內部可能包含大量資料,例如工作表、儲存格的值和格式等。如果傳遞整個結構體,而不是指標,Go 會將整個物件複製一份,這會浪費記憶體和處理時間。- 使用指標可以直接操作原始資料,避免不必要的複製。
-
允許修改原始資料:
- 如果你需要對
excelize.File
做修改(例如更新儲存格的值或新增工作表),指標讓你能夠直接操作原始物件,而不需要傳回新的副本。
- 如果你需要對
-
資源管理:
excelize.File
可能會開啟檔案並佔用系統資源。使用指標可以確保同一份資源不會被複製,方便正確關閉或釋放資源。
上述原話來自chatGPT
func insertData(f *excelize.File, sheetName string, db *sql.DB) {
....
}
- 數字轉字串
moneyCell := "H" + strconv.Itoa(lastEndRow)
-
output的差異
- 功能設計不同:
- fmt
:用於普通的輸出和格式化,更多的是用來處理程序正常運行時的輸出。
- log
:專門用於記錄事件、錯誤和診斷程序問題,通常會自動添加時間戳,讓記錄更方便檢索。
-
使用場景不同:
fmt
適合用於格式化和打印普通的輸出內容(如程序的正常輸出或輸入提示)。log
適合用於記錄關鍵事件(如錯誤日誌、調試資訊),特別是需要包含時間戳的情況。
-
錯誤處理的需求:
fmt
更偏向於簡單的輸出,不關注程序的運行狀態。log
提供專門的方法(如log.Fatal
和log.Panic
),可以快速輸出錯誤並中止程序執行。
以上來自ChatGPT
兩者都有Print,Printf,Println
分別代表 列印,格式化列印(%s,%d),換行列印。
錯誤訊息 fmt.Errorf 與 log.Fatalf ,
前者是回傳error,後者則輸出錯誤訊息並結束程式
-
查SQLite的軟體
brew install db-browser-for-sqlite
Conclusion
ChatGPT很好用沒錯,
不然這個程式花的時間可能要更久,
需要先查要用哪個套件,判斷哪些儲存格是合併的,
再取他後面欄位的值,建立sqlite、table,insert,update。
因為不只一個sheet要做,所以將原本func main底下的程式重構。
讓程式簡潔點。
但是,GPT也是有幻覺,我要計算SQL A跟B 欄位的差距(C),
A已經有值,B是update後才有值,
同時計算C的話,會變成NULL。
GPT跟我說能同時計算,跟我印象中的不一樣,
我一再確認,GPT還是說可以(暈)。